少しだけ原理を振り返る
NNが動作する仕組みはモデルの中のニューロン間の重みを調整することで出力を期待するものに近づける(ロスを少なくする)、というものになっています。
Ex.1 とりあえず、隠し層の個数もニューロン数も0にしてみる
基本ですね。とりあえず小さな数で考えてみると分かることがあるはずという安直な考えです。
Ex.1 実験結果期待する動作です。用意されている7つの入力の重みを計算してその中でできるだけロスが少なくなるようにしているのがよくわかりますね。Ex.2 ニューロンの数を増やしてみる
変わったことがいくつかあります。まず最初に気づくのが結果にランダム性が生じています。実験1では何回実験しても結果は同じになりましたが、実験2では毎回違うような重みで安定しています。次に$n(L_n)=2$ †として実験してみました。$n(L_n)=2$とすると、すこし真ん中の方の学習がうまくいっているような気がします。ここで注目してほしいのは$L_1$(1つ目の隠し層のニューロンの集合)の要素です。反応は単純なものになっていると思いますが良くも悪くも(あっていても間違っていても)特徴を割り出して結果へつながる重みが調整されることによってさっきよりマシな結果が構成されていることがわかります。さて、ここまで$n(L_n)$を0, 1, 2と変えていってその変化を見てみました。3, 4, 5... と増やしていくと7くらいでまあまあ綺麗な学習結果が出ました。しかしここでもやはり、$L_1$の要素はそれぞれ単純な特徴を示して出力層への重みで調整される、というプロセスは変わっていません。Ex.3 層の数を増やした時に注意すること
さて、では$n(L)$を増やしていきます。
Ex.3.1 $n(L)=2, n(L_1)=5, n(L_2)=2$Ex.3.2 $n(L)=2, n(L_1)=5, n(L_2)=5$Ex.3.3 $n(L)=2, n(L_1)=2, n(L_2)=5$ここに3つの結果を並べてみましたが、Ex.3.1、Ex.3.3の結果が興味深いですね。Ex.2.2のときよりも学習結果が悪いです、逆にEx.3.2は層の数を増やした効果がいい感じに出た結果になっています。これが示すことは、$n(L_n)$の大きさは全て同じな場合が一番いい結果が出る、ということです。また、原理に戻って考えてみると複数層があるということはEx.2の時に出力されていたデータ(単純な特徴を検出したもの)を入力としてまた同じことをやっている、と考えることもできますね。すると、2つ目の層はもっと高度な特徴をとらえていることになります。Ex.4 至高
至高を目指しましょう。
Ex.3.2 $n(L)=5, n(L_n)=8$至高です。とりあえず層の数もニューロンの数も増やしてみるといい感じになります。ここでも注目してほしいのは各層のニューロンで、奥の層に行けばいくほど渦巻きを特徴としてとらえていることがわかります。結論
個数が違う層を使うことに意味がないとすれば、隠し層のニューロン数の意味は其れだけの特徴を集めて重みを出力する、ということ。隠し層の個数はその処理の繰り返しを意味していると取ることができます。
複雑な特徴を取るためには沢山のニューロンが必要です、層の数を増やそうと思うのではなく、層ごとのニューロンの数を増やしましょう。なぜなら、ニューロンの数だけ新しい特徴を取ってきてくれるからです。そしてそれをうまく組み合わせて次の層に渡るので層は少なくて済みます。逆に、ニューロンの数が少ないと、取れる特徴の数が少ないです。もっといい特徴が出てくる可能性があるのにある特徴だけでまとめて次の層に渡るため効率的ではないです。† $N = \text{set of neurons}, L \subset N, L = \text{set of neurons of one hidden layer}$
ここではAが集合の時$A_1$はAの要素をなんらかの順番に並べた時の1つ目の要素を表すものとします ↩